/* Copyright (c) [2025] [ylc]. Licensed under Apache-2.0 License. */

#include "my_define.h"

/*********************************   寄存器   *******************************/
//SDA PA14
//SCL PA13
//硬件接口
static void i2c_IoInit(void){
	//io初始化输出高，外部电路上拉，内部则不需要上拉
	GPIOA->PXCON|=GPIO_Pin_14;
	GPIOA->PXCON|=GPIO_Pin_13;
	GPIOA->PXPH&=~GPIO_Pin_14;
	GPIOA->PXPH&=~GPIO_Pin_13;
	GPIOA_BIT->PIN_BIT[14]=1;
	GPIOA_BIT->PIN_BIT[13]=1;
}

static void i2c_Delay(void){
	u16 i;
	for(i=0;i<10;i++){
		__NOP();
	}
}

static void i2c_SdaH(void){
	GPIOA->PXCON&=~GPIO_Pin_14;
	GPIOA_BIT->PIN_BIT[14]=1;
}

static void i2c_SdaL(void){
	GPIOA->PXCON|=GPIO_Pin_14;
	GPIOA_BIT->PIN_BIT[14]=0;
}

static void i2c_SclH(void){
	GPIOA->PXCON&=~GPIO_Pin_13;
	GPIOA_BIT->PIN_BIT[13]=1;
}

static void i2c_SclL(void){
	GPIOA->PXCON|=GPIO_Pin_13;
	GPIOA_BIT->PIN_BIT[13]=0;
}

static u8 i2c_ReadSda(void){
	return GPIOA_BIT->PIN_BIT[14];
}

static u8 i2c_ReadScl(void){
	return GPIOA_BIT->PIN_BIT[13];
}


/*********************************   库函数   *******************************/
//SDA PA14
//SCL PA13
static GPIO_InitTypeDef GPIOInit_Struct;
static void i2c_IoInit(void){
	//io初始化输出高
    GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;
    GPIO_InitTypeDef.GPIO_Mode = GPIO_Mode_OUT_PP;
    GPIO_InitTypeDef.GPIO_DriveLevel = 0;
    GPIO_Init(GPIOA,&GPIO_InitTypeDef);
	GPIO_SetBits(GPIOA,GPIO_Pin_13);
	GPIO_SetBits(GPIOA,GPIO_Pin_14);
}

static void i2c_Delay(void){
	u16 i;
	for(i=0;i<10;i++){
		__NOP();
	}
}

static void i2c_SdaH(void){
	GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitTypeDef.GPIO_Mode = GPIO_Mode_IN_HI;	//外部电路上拉，内部则不需要上拉，否则GPIO_Mode_IN_PU
	GPIO_Init(GPIOA,&GPIO_InitTypeDef);
	GPIO_SetBits(GPIOA,GPIO_Pin_14);
}

static void i2c_SdaL(void){
	GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitTypeDef.GPIO_Mode = GPIO_Mode_OUT_PP;	
	GPIO_Init(GPIOA,&GPIO_InitTypeDef);
	GPIO_ResetBits(GPIOA,GPIO_Pin_14);
}

static void i2c_SclH(void){
	GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitTypeDef.GPIO_Mode = GPIO_Mode_IN_HI;	//外部电路上拉，内部则不需要上拉，否则GPIO_Mode_IN_PU
	GPIO_Init(GPIOA,&GPIO_InitTypeDef);
	GPIO_SetBits(GPIOA,GPIO_Pin_13);
}

static void i2c_SclL(void){
	GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitTypeDef.GPIO_Mode = GPIO_Mode_OUT_PP;	
	GPIO_Init(GPIOA,&GPIO_InitTypeDef);
	GPIO_ResetBits(GPIOA,GPIO_Pin_13);
}

static u8 i2c_ReadSda(void){
	return GPIO_ReadDataBit(GPIOA,GPIO_Pin_14);
}

static u8 i2c_ReadScl(void){
	return GPIO_ReadDataBit(GPIOA,GPIO_Pin_13);
}
